package com.hippo.javacore.multithreading;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

/**
 * @ClassName UseCallableAndFutrueInterfaceCreateThread
 * @Description TODO 使用Callable接口和Future接口创建线程
 * @Author tangxl
 * @create 2023-03-10 11:43
 **/
public class ThreadDemo3 {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        /**
         * 使用Callable接口和Future接口创建线程:
         *  特点:可以获取多线程运行的结果，还可以抛出异常
         *
         *  1.创建一个MyCallable类实现Callable接口
         *  2.重写call(有返回值,表示多线程运行结果)
         *  3.创建Mycallable的对象(表示要执行的任务)、
         *  4.创建FutureTask(Future接口的实现类)对象(作用:管理多线程运行的结果)
         *  5.创建Thread对象,并启动(表示线程)
         */

        //实现Callable接口重写call()方法方式一:新建MyCallable类实现
        MyCallable mc1 = new MyCallable();
        //实现Callable接口重写call()方法方式二:使用Lambda表达式,创建匿名函数
        Callable<Integer> mc2 = ()->{
            // 获取当前线程输出线程名称
            System.out.println(Thread.currentThread().getName()+"执行");
            int sum = 0;
            for (int i = 0; i < 100; i++) {
                sum += i;
            }
            return sum;
        };
        // 创建FutureTask对象
        FutureTask<Integer> ft1 = new FutureTask<Integer>(mc1);
        FutureTask<Integer> ft2 = new FutureTask<Integer>(mc2);
        // 创建Thread
        Thread thread1 = new Thread(ft1);
        Thread thread2 = new Thread(ft2);
        // 线程命名
        thread1.setName("线程A");
        thread2.setName("线程B");
        // 启动线程
        thread1.start();
        // 获取线程执行结果
        Integer result1 = ft1.get();
        Integer result2 = ft1.get();
        System.out.println(ft1 + "执行结果" + result1);
        System.out.println(ft2 + "执行结果" + result2);
    }
}
